package com.mall.controller;

import com.mall.domain.dto.RechargeDTO;
import com.mall.result.Result;
import com.mall.domain.dto.UserDTO;
import com.mall.domain.dto.UserUpdatePasswordDTO;
import com.mall.domain.vo.UserLoginVO;
import com.mall.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
 * 用户控制器
 * @author 勾新杰
 * @version 1.0
 * @date 2024/11/21 22:42
 */
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
@Tag(name = "用户管理", description = "用户管理相关接口")
public class UserController {
    private final UserService userService;

    /**
     * 用户注册，内容是否合法是前端验证，前端传输应当对密码加密，这里进行二次加密
     * @param userDTO 用户信息
     * @return 注册成功
     */
    @Operation(summary = "用户注册")
    @PostMapping("/register")
    public Result<String> register(@RequestBody UserDTO userDTO){
        userService.register(userDTO);
        return Result.success("注册成功");
    }

    /**
     * 用户登录
     * @param userDTO 用户信息
     * @return token
     */
    @Operation(summary = "用户登录")
    @PostMapping("/login")
    public Result<UserLoginVO> login(@RequestBody UserDTO userDTO){
        UserLoginVO userLoginVO = userService.login(userDTO);
        return Result.success(userLoginVO);
    }

    /**
     * 用户修改密码
     * @param updatePasswordDTO 修改密码 DTO
     * @return 修改密码成功
     */
    @Operation(summary = "用户修改密码")
    @PutMapping("/change")
    public Result<String> changePassword(@RequestBody UserUpdatePasswordDTO updatePasswordDTO){
        userService.changePassword(updatePasswordDTO);
        return Result.success("修改密码成功");
    }

    /**
     * 修改用户信息
     * @param userDTO 用户信息
     * @return 修改用户信息成功
     */
    @PutMapping("/update")
    @Operation(summary = "修改用户信息")
    public Result<String> updateUserInfo(@RequestBody UserDTO userDTO){
        userService.updateUserInfo(userDTO);
        return Result.success("修改用户信息成功");
    }

    /**
     * 修改用户状态
     * @param id 用户id
     * @param status 状态
     * @return 修改用户状态成功
     */
    @PutMapping("/status/{status}")
    @Operation(summary = "修改用户状态")
    public Result<String> startOrStopUser(Long id, @PathVariable Integer status){
        userService.updateStatus(id, status);
        return Result.success("修改用户状态成功");
    }

    /**
     * 用户退出登录
     * @return 退出登录成功
     */
    @Operation(summary = "用户退出登录")
    @PostMapping("/logout")
    public Result<String> logout(){
        return Result.success("退出登录成功");
    }

    /**
     * 充值
     * @param rechargeDTO 充值信息
     * @return 充值成功
     */
    @PutMapping("/balance/induct")
    @Operation(summary = "充值")
    public Result<String> induct(@RequestBody RechargeDTO rechargeDTO){
        userService.induct(rechargeDTO);
        return Result.success("充值成功");
    }

    /**
     * 扣款
     * @param rechargeDTO 扣款金额
     * @return 扣款成功
     */
    @PutMapping("/balance/deduct")
    @Operation(summary = "扣款")
    public Result<String> deduct(@RequestBody RechargeDTO rechargeDTO){
        userService.deduct(rechargeDTO);
        return Result.success("扣款成功");
    }
}
